; ** por compatibilidad se omiten tildes **
; ==============================================================================
; TRABAJO PRACTICO 3 - System Programming - ORGANIZACION DE COMPUTADOR II - FCEN
; ==============================================================================
; definicion de rutinas de atencion de interrupciones

%include "imprimir.mac"

global _isr32
global _isr33
global _isr0x66

BITS 32
interrupcion db     'Interrupcion:'
interrupcion_len equ    $ - interrupcion
sched_tarea_offset:     dd 0x00
sched_tarea_selector:   dw 0x00

extern print_hex
extern imprimir_como_ascii
extern atender_teclado
extern game_move_current_zombi
extern desalojar_tarea
extern atender_debug
extern up_relojes

;; PIC
extern fin_intr_pic1

;; Sched
extern sched_proximo_indice

;;
;; Definición de MACROS
;; -------------------------------------------------------------------------- ;;

%macro ISR 1
global _isr%1

_isr%1:
    pushad
    ; jmp .posta
    ; imprimir_texto_mp interrupcion, interrupcion_len, 0x07, 0, 0
    ; mov edx, 00001111b
    ; push edx
    ; mov edx, interrupcion_len
    ; push edx
    ; xor edx, edx
    ; push edx
    ; mov edx, 1
    ; push edx
    ; mov eax, %1
    ; push eax
    ; call print_hex
    ; add esp, 20
    ; .posta:
    mov eax, %1
    call atender_debug
    call desalojar_tarea
    jmp 0x70:0              ;salto a la tarea idle para completar el quantum 
    popad
    iret
%endmacro

;;
;; Datos
;; -------------------------------------------------------------------------- ;;
offset: dd 0
selector: dw 0


; Scheduler
isrnumero:           dd 0x00000000
isrClock:            db '|/-\'

;;
;; Rutina de atención de las EXCEPCIONES
;; -------------------------------------------------------------------------- ;;
ISR 0
ISR 1
ISR 2
ISR 3
ISR 4
ISR 5
ISR 6
ISR 7
ISR 8
ISR 9
ISR 10
ISR 11
ISR 12
ISR 13
ISR 14
ISR 15
ISR 16
ISR 17
ISR 18
ISR 19

;;
;; Rutina de atención del RELOJ
;; -------------------------------------------------------------------------- ;;

_isr32:
pushad
call up_relojes
call proximo_reloj
call sched_proximo_indice
cmp ax, 0
je .nojump
    mov [selector], ax
    call fin_intr_pic1
    jmp far [offset]
    jmp .fin
    .nojump:
    call fin_intr_pic1
.fin:
popad
iret

;;
;; Rutina de atención del TECLADO
;; -------------------------------------------------------------------------- ;;

_isr33:
pushad
call fin_intr_pic1
xor eax, eax
in al, 0x60
push eax
;call imprimir_como_ascii
call atender_teclado
add esp, 4
popad
iret

;;
;; Rutinas de atención de las SYSCALLS
;; -------------------------------------------------------------------------- ;;

_isr0x66:
pushad
push eax
call game_move_current_zombi
add esp, 4
jmp 0x70:0      ;salto a la idle para completar el quantum
popad
iret

%define IZQ 0xAAA
%define DER 0x441
%define ADE 0x83D
%define ATR 0x732


;; Funciones Auxiliares
;; -------------------------------------------------------------------------- ;;
proximo_reloj:
        pushad
        inc DWORD [isrnumero]
        mov ebx, [isrnumero]
        cmp ebx, 0x4
        jl .ok
                mov DWORD [isrnumero], 0x0
                mov ebx, 0
        .ok:
                add ebx, isrClock
                imprimir_texto_mp ebx, 1, 0x0f, 49, 79
                popad
        ret
        
        
